{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "# 分组和聚合",
   "id": "c2c555cff4e82db1"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:24:38.396173Z",
     "start_time": "2025-09-15T12:24:37.920375Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import pandas as pd\n",
    "path = 'D:/2506A/monty03/day16/file/'"
   ],
   "id": "cae0926516683122",
   "outputs": [],
   "execution_count": 1
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:28:01.808342Z",
     "start_time": "2025-09-15T12:28:01.794012Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df = pd.read_excel(path + '分组聚合.xlsx')\n",
    "\n",
    "df2 = df.groupby(['城市','区'])\n",
    "print(df2.apply(lambda x: x,include_groups=False))"
   ],
   "id": "9b53209c6bca88c5",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "           人数  金额\n",
      "城市  区            \n",
      "北京市 东城区 2  40  80\n",
      "        7  48  96\n",
      "    西城区 0  37  74\n",
      "        4  49  98\n",
      "        8  26  52\n",
      "天津  南开区 3  34  68\n",
      "        5  44  88\n",
      "        9  30  60\n",
      "    和平区 1  48  96\n",
      "        6  49  98\n"
     ]
    }
   ],
   "execution_count": 9
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:31:00.144643Z",
     "start_time": "2025-09-15T12:31:00.130066Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df = pd.read_excel(path + '分组聚合.xlsx')\n",
    "\n",
    "df2 = df.groupby(['城市','区'])[['人数','金额']].sum()\n",
    "print(df2.apply(lambda x: x))"
   ],
   "id": "28ac664a4dd81474",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          人数   金额\n",
      "城市  区            \n",
      "北京市 东城区   88  176\n",
      "    西城区  112  224\n",
      "天津  南开区  108  216\n",
      "    和平区   97  194\n"
     ]
    }
   ],
   "execution_count": 13
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## agg 函数",
   "id": "fa20d7d5df1fe542"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:34:03.978575Z",
     "start_time": "2025-09-15T12:34:03.963053Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df = pd.read_excel(path + '分组聚合2.xlsx')\n",
    "print(df)\n",
    "\n",
    "dict1 = {\n",
    "    '1月':'count',\n",
    "    '2月':'sum',\n",
    "    '3月':'max',\n",
    "    '4月':'min'\n",
    "}\n",
    "\n",
    "# 使用聚合函数\n",
    "df2 = df.groupby('店号').agg(dict1)\n",
    "print(df2)"
   ],
   "id": "6939887388bcd3dd",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     店号  1月  2月  3月  4月\n",
      "0    1店  25  77  76  29\n",
      "1    2店  49  84  95  75\n",
      "2   25店  57  80  44  28\n",
      "3   35店  46  25  95  37\n",
      "4  105店  57  84  95  37\n",
      "5  225店  57  77  76  28\n",
      "      1月  2月  3月  4月\n",
      "店号                  \n",
      "105店   1  84  95  37\n",
      "1店     1  77  76  29\n",
      "225店   1  77  76  28\n",
      "25店    1  80  44  28\n",
      "2店     1  84  95  75\n",
      "35店    1  25  95  37\n"
     ]
    }
   ],
   "execution_count": 16
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:38:08.902995Z",
     "start_time": "2025-09-15T12:38:08.894808Z"
    }
   },
   "cell_type": "code",
   "source": [
    "import numpy as np\n",
    "\n",
    "# 创建示例数据\n",
    "data = {\n",
    "    'name': ['Alice', 'Bob', 'Charlie', 'David', 'Alice', 'Bob'],\n",
    "    'age': [24, 27, 22, 32, 25, 28],\n",
    "    'salary': [50000, 60000, 45000, 70000, 55000, 65000]\n",
    "}\n",
    "\n",
    "df = pd.DataFrame(data, columns=['name', 'age', 'salary'])\n",
    "\n",
    "result = df.groupby('name').agg({\n",
    "    'age':['mean','sum'],\n",
    "    'salary':['max','min']\n",
    "})\n",
    "print(result)"
   ],
   "id": "3108963099303a01",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "          age     salary       \n",
      "         mean sum    max    min\n",
      "name                           \n",
      "Alice    24.5  49  55000  50000\n",
      "Bob      27.5  55  65000  60000\n",
      "Charlie  22.0  22  45000  45000\n",
      "David    32.0  32  70000  70000\n"
     ]
    }
   ],
   "execution_count": 23
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 使用字典进行分组",
   "id": "cd0b3ea36e0240e0"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:41:35.273029Z",
     "start_time": "2025-09-15T12:41:35.261554Z"
    }
   },
   "cell_type": "code",
   "source": [
    "df = pd.read_excel(path + '分组聚合2.xlsx')\n",
    "print(df)\n",
    "\n",
    "dict1 =  {'1月': '一季度', '2月': '一季度', '3月': '一季度', '4月': '二季度'}\n",
    "df2 = df.T.groupby(dict1).sum()\n",
    "print(df2)"
   ],
   "id": "1ebbfd56cf45a75a",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "     店号  1月  2月  3月  4月\n",
      "0    1店  25  77  76  29\n",
      "1    2店  49  84  95  75\n",
      "2   25店  57  80  44  28\n",
      "3   35店  46  25  95  37\n",
      "4  105店  57  84  95  37\n",
      "5  225店  57  77  76  28\n",
      "       0    1    2    3    4    5\n",
      "一季度  178  228  181  166  236  210\n",
      "二季度   29   75   28   37   37   28\n"
     ]
    }
   ],
   "execution_count": 30
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "## 通过函数分组",
   "id": "72d5437265adac9b"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:51:10.910483Z",
     "start_time": "2025-09-15T12:51:10.900642Z"
    }
   },
   "cell_type": "code",
   "source": [
    "\n",
    "数据 = pd.read_excel(path + '分组聚合.xlsx',index_col='城市')\n",
    "数据2 = 数据.groupby(len).sum()\n",
    "print(数据2)"
   ],
   "id": "e920d7ec5005b46d",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "                  区   人数   金额\n",
      "城市                           \n",
      "2   和平区南开区南开区和平区南开区  205  410\n",
      "3   西城区东城区西城区东城区西城区  200  400\n"
     ]
    }
   ],
   "execution_count": 42
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:53:05.182438Z",
     "start_time": "2025-09-15T12:53:05.169103Z"
    }
   },
   "cell_type": "code",
   "source": [
    "数据 = pd.read_excel(path + '分组聚合2.xlsx',index_col='店号')\n",
    "print(数据)\n",
    "# 自定义分组逻辑\n",
    "S1 = ['北京','北京','北京','北京','天津','天津']\n",
    "数据2= 数据.groupby([len])\n",
    "print(数据2.apply(lambda x: x))\n",
    "数据2= 数据.groupby([len]).min()\n",
    "print(数据2)"
   ],
   "id": "18ff8128875e0129",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "      1月  2月  3月  4月\n",
      "店号                  \n",
      "1店    25  77  76  29\n",
      "2店    49  84  95  75\n",
      "25店   57  80  44  28\n",
      "35店   46  25  95  37\n",
      "105店  57  84  95  37\n",
      "225店  57  77  76  28\n",
      "         1月  2月  3月  4月\n",
      "店号 店号                  \n",
      "2  1店    25  77  76  29\n",
      "   2店    49  84  95  75\n",
      "3  25店   57  80  44  28\n",
      "   35店   46  25  95  37\n",
      "4  105店  57  84  95  37\n",
      "   225店  57  77  76  28\n",
      "    1月  2月  3月  4月\n",
      "店号                \n",
      "2   25  77  76  29\n",
      "3   46  25  44  28\n",
      "4   57  77  76  28\n"
     ]
    }
   ],
   "execution_count": 51
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T12:56:48.523156Z",
     "start_time": "2025-09-15T12:56:48.511568Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 通过多层索引分组\n",
    "df = pd.read_excel(path + '分组聚合3.xlsx',index_col=[0,1])\n",
    "print(df)\n",
    "\n",
    "result = df.groupby(['班级','性别']).mean()\n",
    "print(result)"
   ],
   "id": "6c5f24ed7a805c9",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "       语文  数学\n",
      "班级 性别        \n",
      "一班 男   55  68\n",
      "   女   76  76\n",
      "二班 男   51  65\n",
      "   女   54  69\n",
      "三班 男   50  78\n",
      "   女   51  76\n",
      "四班 男   80  67\n",
      "   女   62  70\n",
      "         语文    数学\n",
      "班级 性别            \n",
      "一班 女   76.0  76.0\n",
      "   男   55.0  68.0\n",
      "三班 女   51.0  76.0\n",
      "   男   50.0  78.0\n",
      "二班 女   54.0  69.0\n",
      "   男   51.0  65.0\n",
      "四班 女   62.0  70.0\n",
      "   男   80.0  67.0\n"
     ]
    }
   ],
   "execution_count": 54
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2025-09-15T13:03:31.789996Z",
     "start_time": "2025-09-15T13:03:31.778261Z"
    }
   },
   "cell_type": "code",
   "source": [
    "# 通过多层索引分组\n",
    "df = pd.read_excel(path + '分组聚合4.xlsx',header=[0,1])\n",
    "\n",
    "# 定义季度和月份的列表\n",
    "L1 = ['1季度', '1季度', '1季度', '2季度', '2季度']\n",
    "L2 = ['1月', '2月', '3月', '4月', '5月']\n",
    "# 创建多层索引\n",
    "index = pd.MultiIndex.from_arrays([L1, L2],names=['季度','月份'])\n",
    "df2 = pd.DataFrame(df,columns=index)\n",
    "# print(df2.T)\n",
    "result= df2.T.groupby('季度').sum().T\n",
    "print(result)"
   ],
   "id": "e79e3c75e9af7d3f",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "季度  1季度  2季度\n",
      "0   112   49\n",
      "1    97   75\n",
      "2    99   69\n",
      "3    92   55\n",
      "4   135   61\n",
      "5    89   80\n"
     ]
    }
   ],
   "execution_count": 65
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
